package br.unb.ida.midialab.pedparq;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

import android.app.Service;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.text.format.Time;
import android.util.Log;

public class Utils implements TextToSpeech.OnInitListener {
    private static final String TAG = "Utils";
    private Service mService;
    
    private static Utils instance = null;

    private Utils() {
    }
     
    public static Utils getInstance() {
        if (instance == null) {
            instance = new Utils();
        }
        return instance;
    }
    
    public void setService(Service service) {
        mService = service;
    }
    
    /********** SPEAKING **********/
    
    private TextToSpeech mTts;
    private boolean mSpeak = false;
    private boolean mSpeakingEngineAvailable = false;

    public void initTTS() {
        // Initialize text-to-speech. This is an asynchronous operation.
        // The OnInitListener (second argument) is called after initialization completes.
        Log.i(TAG, "Initializing TextToSpeech...");
        mTts = new TextToSpeech(mService,
            this  // TextToSpeech.OnInitListener
            );
    }
    public void shutdownTTS() {
        Log.i(TAG, "Shutting Down TextToSpeech...");

        mSpeakingEngineAvailable = false;
        mTts.shutdown();
        Log.i(TAG, "TextToSpeech Shut Down.");

    }
    public void say(String text) {
        if (mSpeak && mSpeakingEngineAvailable) {
            mTts.speak(text,
                    TextToSpeech.QUEUE_ADD,  // Drop all pending entries in the playback queue.
                    null);
        }
    }

    // Implements TextToSpeech.OnInitListener.
    public void onInit(int status) {
        // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
        if (status == TextToSpeech.SUCCESS) {
            int result = mTts.setLanguage(Locale.US);
            if (result == TextToSpeech.LANG_MISSING_DATA ||
                result == TextToSpeech.LANG_NOT_SUPPORTED) {
               // Language data is missing or the language is not supported.
                Log.e(TAG, "Language is not available.");
            } else {
                Log.i(TAG, "TextToSpeech Initialized.");
                mSpeakingEngineAvailable = true;
            }
        } else {
            // Initialization failed.
            Log.e(TAG, "Could not initialize TextToSpeech.");
        }
    }

    public void setSpeak(boolean speak) {
        mSpeak = speak;
    }

    public boolean isSpeakingEnabled() {
        return mSpeak;
    }

    public boolean isSpeakingNow() {
        return mTts.isSpeaking();
    }

    public void ding() {
    }
    
    /********** Time **********/
    
    public static long currentTimeInMillis() {
        Time time = new Time();
        time.setToNow();
        return time.toMillis(false);
    }
    
    /********** Date **********/
    
    public String montarData(long dateLong) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTimeInMillis(dateLong);
		
		StringBuilder fullDate = new StringBuilder();
		
		fullDate
		.append(diaSemana(calendar.get(Calendar.DAY_OF_WEEK))+" ")//dia da semana
		.append(calendar.get(Calendar.DAY_OF_MONTH)).append("/")
		.append(getRightMonth(calendar.get(Calendar.MONTH))).append("/")
		.append(calendar.get(Calendar.YEAR)+" ")
		.append(calendar.get(Calendar.HOUR_OF_DAY)+":").append(calendar.get(Calendar.MINUTE)+":").append(calendar.get(Calendar.SECOND));

		return fullDate.toString();
	}
    
    private String getRightMonth(int i) {
    	String mesDecimal;
    	i++;
    	float teste = i%10;
    	if((i%10)<1)
    		mesDecimal = "0"+i;
    	else
    		mesDecimal = ""+i;
		return mesDecimal;
	}

	private String diaSemana(int dayOfWeek) {
		switch (dayOfWeek) {
		case Calendar.MONDAY:
			return "seg";
		case Calendar.TUESDAY:
			return "ter";
		case Calendar.WEDNESDAY:
			return "qua";
		case Calendar.THURSDAY:
			return "qui";
		case Calendar.FRIDAY:
			return "sex";
		case Calendar.SATURDAY:
			return "sab";
		case Calendar.SUNDAY:
			return "dom";
		default:
			return "x";
		} 
	}
    
	public String tempoToString(long ms){
		int s = (int) (ms / 1000) % 60;
		int m = (int) (ms / (1000 * 60)) % 60;
		int h = (int) (ms / (1000 * 60 * 60)) % 24;
		
		String hString;
		String mString;
		String sString;
		String horaCompleta;
		if(h/10<1)
			hString = "0"+h;
		else
			hString = ""+h;
		
		if(m/10<1)
			mString = "0"+m;
		else
			mString = ""+m;
		float div = s%10;
		if(s/10<1)
			sString = "0"+s;
		else
			sString = ""+s;
		if (hString.equals("00".toString())){
			horaCompleta = mString+":"+sString+"s";
		}else{
			horaCompleta = hString+":"+mString+":"+sString;
		}
		return horaCompleta;
	}
	
	public String formatTempo(String tempo){
		//TODO apresentar os formatos de tempo com 2 algarismos
		
		return null;
	}
	
	public Bundle atividadeToBundle(Atividade atividade) {
    	Bundle bAtividade = new Bundle();
    	if(atividade.getId()!=null)
    		bAtividade.putString("id", atividade.getId());
    	//TODO pog nullpointer
    	if(atividade.getUser() == null)
    		bAtividade.putString("user", "null");
    	else
    		bAtividade.putString("user", atividade.getUser());
    	bAtividade.putLong("data", atividade.getDate());
    	bAtividade.putLong("tempoMili", atividade.getTempoAtividade());
    	bAtividade.putString("tempoString", String.valueOf(atividade.getTempoAtividade()));
    	bAtividade.putInt("passos", atividade.getPassos());
    	bAtividade.putInt("ritmo", atividade.getRitmo());
    	bAtividade.putFloat("distancia", atividade.getDistancia());
    	bAtividade.putInt("calorias", atividade.getCalorias());
    	bAtividade.putFloat("velMedia", atividade.getVelMedia());
    	bAtividade.putString("status", atividade.getStatus());
    	bAtividade.putString("tipo", atividade.getTipo());
    	bAtividade.putInt("isSync", atividade.getIsSync());
    	
    	return bAtividade;
	}

	public boolean sincronizarAtividade(Atividade atividade) {
		// TODO Auto-generated method stub
		return false;
	}
}
